package dao;

import java.util.List;

import javax.persistence.NoResultException;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import entidade.Usuario;

@SuppressWarnings("unchecked")
public class UsuarioDAO {

	public void salve(Usuario usuario) {
		Session sessao = null;
		try {
			sessao = Conexao.getConexao();
			Transaction transacao = sessao.beginTransaction();
			sessao.save(usuario);
			transacao.commit();
		} finally {
			sessao.close();
		}
	}

	public void update(Usuario usuario) {
		Session sessao = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			Transaction transacao = sessao.beginTransaction();
			sessao.update(usuario);
			transacao.commit();
		} finally {
			sessao.close();
		}
	}

	public void delete(Usuario usuario) {
		Session sessao = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			Transaction transacao = sessao.beginTransaction();
			sessao.delete(usuario);
			transacao.commit();
		} finally {
			sessao.close();
		}
	}

	public Usuario validaUsuario(Usuario usuario) {
		Session sessao = null;
		Usuario u = null;
		Transaction transacao = null;
		Query consulta = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			transacao = sessao.beginTransaction();
			consulta = sessao.createQuery("from Usuario where login = :login and senha = :senha");
			consulta.setString("login", usuario.getLogin());
			consulta.setString("senha", usuario.getSenha());
			u = (Usuario) consulta.uniqueResult();
			transacao.commit();
		} catch (NoResultException e) {
			u = null;
		} catch (RuntimeException e) {
			e.printStackTrace();
		} finally {
			sessao.close();
		}
		return u;
	}

	public List<Usuario> list() {
		Session sessao = null;
		Transaction transacao = null;
		Query consulta = null;
		List<Usuario> lista = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			transacao = sessao.beginTransaction();
			consulta = sessao.createQuery("from Usuario");
			lista = consulta.list();
			transacao.commit();
			return lista;
		} finally {
			sessao.close();
		}
	}

	public Usuario find(Integer codigo) {
		Session sessao = null;
		Transaction transacao = null;
		Query consulta = null;
		Usuario usuario = null;
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			transacao = sessao.beginTransaction();
			consulta = sessao
					.createQuery("from Usuario where codigo = :parametro");
			consulta.setInteger("parametro", codigo);
			usuario = (Usuario) consulta.uniqueResult();
			transacao.commit();
			return usuario;
		} finally {
			sessao.close();
		}
	}

}
